#ifndef BLOCKCONSTRAINEDPROBLEM_HPP_
#define BLOCKCONSTRAINEDPROBLEM_HPP_

#include "Problem.hpp"

class BlockConstrainedProblem: public Problem {
public:
	BlockConstrainedProblem(Index dimension) : Problem(dimension) {};

	/************* NEW METHODS TO OVERRIDE **************/
	virtual bool get_nlp_info(Index& n, Index& m, Index& nnz_jac_g,
			Index& nnz_h_lag) = 0;

	virtual bool get_bounds_info(Index m, Number* g_l, Number* g_u) = 0;

	virtual bool get_starting_point(Index n, Number* x) = 0;

	/****************** PROXIES ******************/

	bool get_nlp_info(Index& n, Index& m, Index& nnz_jac_g, Index& nnz_h_lag,
			IndexStyleEnum& index_style);

	bool get_bounds_info(Index n, Number* x_l, Number* x_u, Index m,
			Number* g_l, Number* g_u);

	bool
			get_starting_point(Index n, bool init_x, Number* x, bool init_z,
					Number* z_L, Number* z_U, Index m, bool init_lambda,
					Number* lambda);

	bool eval_h(Index n, const Number* x, bool new_x, Number obj_factor,
			Index m, const Number* lambda, bool new_lambda, Index nele_hess,
			Index* iRow, Index* jCol, Number* values);

};

#endif /* BLOCKCONSTRAINEDPROBLEM_HPP_ */
